package ejb.casacentral.service.controller;

import java.io.FileNotFoundException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import comun.casacentral.proxy.parceador.UtilsXML;
import comun.casacentral.proxy.proveedor.ordencompra.ClienteOrdenCompraXML;
import comun.casacentral.proxy.proveedor.ordencompra.ItemOrdenCompraXML;
import comun.casacentral.proxy.proveedor.ordencompra.ItemsOrdenCompraXML;
import comun.casacentral.proxy.proveedor.ordencompra.OrdenCompraXML;
import comun.casacentral.proxy.proveedor.ordencompra.RodamientoOrdenCompraXML;
import comun.casacentral.proxy.proveedor.ordencomprarecivida.OrdenCompraRecibidaXML;

import ejb.casacentral.log.CasaLogger;
import ejb.casacentral.persistence.entity.CasaCentralDatos;
import ejb.casacentral.persistence.entity.GrupoIP;
import ejb.casacentral.persistence.entity.ItemOrdenCompra;
import ejb.casacentral.persistence.entity.ItemRodamiento;
import ejb.casacentral.persistence.entity.OrdenCompra;
import ejb.casacentral.persistence.entity.Rodamiento;
import ejb.casacentral.persistence.entity.SolicitudCompra;
import ejb.casacentral.service.jms.MensajeJMSSender;

@Stateless
public class OrdenCompraControllerBean implements OrdenCompraController {
	
	@EJB
	private MensajeJMSSender jmsSender;

	@PersistenceContext(unitName="casacentral")
	private EntityManager em;
	
	@EJB
	private SolicitudController solicitudController;
	
	@EJB
	private GrupoIPController grupoIPController;
	
	@EJB
	private CasaCentralDatosController casaCentralDatosController;
	
	private int i = 1;
	
	@Override
	public OrdenCompra obtenerOrdenPorCodigo(long nroOrdenCompra) {
		CasaLogger.log(" obteniendo entidad .... ");
		return (OrdenCompra)  em.createNamedQuery("OrdenCompra.porCodigo").setParameter("id", nroOrdenCompra).getSingleResult();
	}
	
	
	private String parseoOrdenToXml(OrdenCompra orden, CasaCentralDatos casa) {
		CasaLogger.log("CasaXMLUtils....");
		
		UtilsXML utils = new UtilsXML();
		
		CasaLogger.log("CasaXMLUtils2....");
		
		OrdenCompraXML ordenXML = new OrdenCompraXML();
		
		ClienteOrdenCompraXML cliente = new ClienteOrdenCompraXML();
		cliente.setCuit(casa.getCuil());
		
		ordenXML.setNroOrdenCompra(String.valueOf(orden.getId()));
		
		ordenXML.setCliente(cliente);

		SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
		ordenXML.setFecha(simple.format(new Date()));

		
		ItemsOrdenCompraXML items  = new ItemsOrdenCompraXML();

		items.setItemOrdenCompraCC(parseoItemOrdenCompraToXml(orden.getRodamientos()));
		
		ordenXML.setItemsOCCC(items);

		
		return utils.toXML(ordenXML, OrdenCompraXML.class);
	}
	
	
	private List<ItemOrdenCompraXML> parseoItemOrdenCompraToXml(List<ItemOrdenCompra> rodamientos) {
		List<ItemOrdenCompraXML> items = new ArrayList<ItemOrdenCompraXML>();
		int i = 1;
		for (ItemOrdenCompra item : rodamientos) {
			ItemOrdenCompraXML itemxml = new ItemOrdenCompraXML();

			itemxml.setCantidad(item.getCantidad());
			itemxml.setNroItem(i);

			RodamientoOrdenCompraXML rodamiento = new RodamientoOrdenCompraXML();
			Rodamiento rod = item.getRodamiento();

			rodamiento.setCodigoRodamiento(rod.getCodigo());

			itemxml.setRodamiento(rodamiento);

			items.add(itemxml);
		}

		return items;
	}
	
	
	
	@Override
	public void generarOrdenesDeCompra (String SolicitudCompraxml){
		
		CasaLogger.log();
		SolicitudCompra solicitud= solicitudController.generarSolicitudCompra(SolicitudCompraxml);
		
		List<ItemRodamiento> items = solicitud.getRodamientos();
				
		HashMap<String, OrdenCompra> ordenes = new HashMap<String, OrdenCompra>();
		
		CasaLogger.log(" Pasando Solicitudes a Ordenes de Compra .... " );
		
		for (ItemRodamiento item : items) {
			
			Rodamiento rodamientoSolicitado = item.getRodamiento();
			
			ItemOrdenCompra ioc = new ItemOrdenCompra(rodamientoSolicitado, item.getCantidad());
			
			if (ordenes.get(rodamientoSolicitado.getProveedor().getCuil()) != null) {
				OrdenCompra orden = ordenes.get(rodamientoSolicitado.getProveedor().getCuil());
				orden.addRodamiento(ioc);

			} else {
				OrdenCompra orden = new OrdenCompra();
				orden.addRodamiento(ioc);
				orden.setId(Long.valueOf(1));
				orden.setFechaEmision(new Date());
				orden.setProveedor(rodamientoSolicitado.getProveedor());
				orden.setSolicitud(solicitud);
				ordenes.put(orden.getProveedor().getCuil(), orden);
			}
		}
		
		CasaLogger.log(" Persistiendo Ordenes de Compra .... " );
		
		for(OrdenCompra orden : ordenes.values()){

			
			
			CasaLogger.log(" persistiendo entidad .... "); 
			orden = em.merge(orden);
			em.flush();
			
			
			CasaCentralDatos casaCentral = casaCentralDatosController.obtenerPorCodigo("01");
			
			CasaLogger.log("orden: "+orden);
			
			i++;
			
			String ordenXML = parseoOrdenToXml(orden, casaCentral);
			
			GrupoIP grupo =  grupoIPController.obtenerPorCodigo(orden.getProveedor().getCuil());
			
			CasaLogger.log(" Enviando Ordenes de Compra al proveedor "+orden.getProveedor().getCuil()+" .... " );
			
			jmsSender.sendMesaje(ordenXML, grupo.getIp() , "ordenCompraQueue");
			
		}
		
		
	}


	@Override
	public void recibirOrdenAceptada(String ordenAceptada) {
		UtilsXML util = new UtilsXML();
		
		try {
			OrdenCompraRecibidaXML orden =  util.toClase(ordenAceptada, OrdenCompraRecibidaXML.class);
			
			OrdenCompra ordenCompra = obtenerOrdenPorCodigo(Long.parseLong(orden.getNroOrdenCompra()));
			
			ordenCompra.setEstado("Recibido");
			
			CasaLogger.log(" persistiendo entidad .... "); 
			em.merge(ordenCompra);
			em.flush();
			
//			@SuppressWarnings("unchecked")
//			List<OrdenCompra> ordenSolicitud = new ArrayList<OrdenCompra>(); 
//			(List<OrdenCompra>) em.createNamedQuery("OrdenCompra.porSolicitud").setParameter("solicitud", ordenCompra.getSolicitud().getCodigo()).getResultList();
			
//			ordenCompra.getSolici
//			tud().chequearEstado(ordenSolicitud);
			
			CasaLogger.log();
			@SuppressWarnings("unchecked")
			List<OrdenCompra> ordenSolicitud = (List<OrdenCompra>) em.createQuery("from OrdenCompra o  where o.solicitud.codigo = :codigo ").setParameter("codigo", ordenCompra.getSolicitud().getCodigo()).getResultList();
			String estado = "completa";
			for(OrdenCompra ordenSol : ordenSolicitud){
				if(!ordenSol.getEstado().equals("Recibido")){
					estado = "pendiente";
				}
			}
			if( estado.equals("completa")){
				SolicitudCompra sol = ordenCompra.getSolicitud();
				sol.setEstado("completa");
				em.merge(sol);
				em.flush();
			}
			
		} catch (FileNotFoundException e) {
			CasaLogger.log("No se puedo mapear OdenCompraRecibidaXML");
			e.printStackTrace();
		}
	}


	
	



}
